/**
 * <copyright>
 *
 * Copyright (c) 2002-2006 IBM Corporation and others.
 * All rights reserved.   This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: 
 *   IBM - Initial API and implementation
 *
 * </copyright>
 *
 * $Id: EStructuralFeature.java,v 1.14 2007/06/14 18:32:46 emerks Exp $
 */
package org.oppoweb.emf.ecore {


import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.ecore.util.FeatureMap;


/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>EStructural Feature</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * <ul>
 *   <li>{@link org.eclipse.emf.ecore.EStructuralFeature#isChangeable <em>Changeable</em>}</li>
 *   <li>{@link org.eclipse.emf.ecore.EStructuralFeature#isVolatile <em>Volatile</em>}</li>
 *   <li>{@link org.eclipse.emf.ecore.EStructuralFeature#isTransient <em>Transient</em>}</li>
 *   <li>{@link org.eclipse.emf.ecore.EStructuralFeature#getDefaultValueLiteral <em>Default Value Literal</em>}</li>
 *   <li>{@link org.eclipse.emf.ecore.EStructuralFeature#getDefaultValue <em>Default Value</em>}</li>
 *   <li>{@link org.eclipse.emf.ecore.EStructuralFeature#isUnsettable <em>Unsettable</em>}</li>
 *   <li>{@link org.eclipse.emf.ecore.EStructuralFeature#isDerived <em>Derived</em>}</li>
 *   <li>{@link org.eclipse.emf.ecore.EStructuralFeature#getEContainingClass <em>EContaining Class</em>}</li>
 * </ul>
 * </p>
 *
 * @see org.eclipse.emf.ecore.EcorePackage#getEStructuralFeature()
 * @model abstract="true"
 *        annotation="http://www.eclipse.org/emf/2002/Ecore constraints='ValidDefaultValueLiteral'"
 * @generated
 */
public interface EStructuralFeature extends ETypedElement
{
  /**
   * Returns the value of the '<em><b>Transient</b></em>' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Transient</em>' attribute.
   * @see #setTransient(boolean)
   * @see org.eclipse.emf.ecore.EcorePackage#getEStructuralFeature_Transient()
   * @model
   * @generated
   */
  function get transient():Boolean;

  /**
   * Sets the value of the '{@link org.eclipse.emf.ecore.EStructuralFeature#isTransient <em>Transient</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Transient</em>' attribute.
   * @see #isTransient()
   * @generated
   */
  function set transient(value:Boolean):void;

  /**
   * Returns the value of the '<em><b>Volatile</b></em>' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Volatile</em>' attribute.
   * @see #setVolatile(boolean)
   * @see org.eclipse.emf.ecore.EcorePackage#getEStructuralFeature_Volatile()
   * @model
   * @generated
   */
  function get volatile():Boolean;

  /**
   * Sets the value of the '{@link org.eclipse.emf.ecore.EStructuralFeature#isVolatile <em>Volatile</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Volatile</em>' attribute.
   * @see #isVolatile()
   * @generated
   */
  function set volatile(value:Boolean):void;

  /**
   * Returns the value of the '<em><b>Changeable</b></em>' attribute.
   * The default value is <code>"true"</code>.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Changeable</em>' attribute.
   * @see #setChangeable(boolean)
   * @see org.eclipse.emf.ecore.EcorePackage#getEStructuralFeature_Changeable()
   * @model default="true"
   * @generated
   */
  function get changeable():Boolean;

  /**
   * Sets the value of the '{@link org.eclipse.emf.ecore.EStructuralFeature#isChangeable <em>Changeable</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Changeable</em>' attribute.
   * @see #isChangeable()
   * @generated
   */
  function set changeable(value:Boolean):void;

  /**
   * Returns the value of the '<em><b>Default Value Literal</b></em>' attribute.
   * <!-- begin-user-doc -->
   * <p>
   * It represents the serialized form of the default value.
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Default Value Literal</em>' attribute.
   * @see #setDefaultValueLiteral(String)
   * @see org.eclipse.emf.ecore.EcorePackage#getEStructuralFeature_DefaultValueLiteral()
   * @model
   * @generated
   */
  function get defaultValueLiteral():String;

  /**
   * Sets the value of the '{@link org.eclipse.emf.ecore.EStructuralFeature#getDefaultValueLiteral <em>Default Value Literal</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Default Value Literal</em>' attribute.
   * @see #getDefaultValueLiteral()
   * @generated
   */
  function set defaultValueLiteral(value:String):void;

  /**
   * Returns the value of the '<em><b>Default Value</b></em>' attribute.
   * <!-- begin-user-doc -->
   * <p>
   * It represents the default value that feature must take on when an
   * explicit value has not been set.  Specifically, it may be non-null if
   * the feature has an {@link ETypedElement#getEType eType}.  If the
   * {@link #getDefaultValueLiteral defaultValueLiteral} is null, it is
   * simply the <code>eType</code>'s intrinsic {@link
   * EClassifier#getDefaultValue default value}.  Otherwise, if the 
   * <code>eType</code> is an {@link EDataType} and the
   * <code>defaultValueLiteral</code> is non-null, it is the object created
   * by the factory's {@link EFactory#createFromString} method when invoked
   * with those two objects as parameters.
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Default Value</em>' attribute.
   * @see org.eclipse.emf.ecore.EcorePackage#getEStructuralFeature_DefaultValue()
   * @model transient="true" changeable="false" volatile="true" derived="true"
   * @generated
   */
  function get defaultValue():Object;

  /**
   * A convenience method for setting the '<em><b>Default Value Literal</b></em>' attribute.
   * <p>
   * If the feature has an {@link ETypedElement#getEType eType} that is an
   * {@link EDataType}, the specified <code>value</code> is converted to
   * a string using the factory's {@link EFactory#convertToString} 
   * method, and the {@link #getDefaultValueLiteral defaultValueLiteral} is
   * set to the result.
   * </p>
   * @see #setDefaultValueLiteral
   */
  function set defaultValue(value:Object):void;

  /**
   * Returns the value of the '<em><b>Unsettable</b></em>' attribute.
   * <!-- begin-user-doc -->
   * <p>
   * An unsettable feature explicitly models the state of being set verses being unset
   * and so provides a direct implementation for the reflective {@link EObject#eIsSet eIsSet}.
   * It is only applicable {@link ETypedElement#isMany single-valued} features.
   * One effect of this setting is that,
   * in addition to generating the methods <code>getXyz</code>
   * and <code>setXyz</code> (if the feature is {@link #isChangeable changeable}),
   * a reflective generator will generate the methods <code>isSetXyz</code> and <code>unsetXyz</code>.
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Unsettable</em>' attribute.
   * @see #setUnsettable(boolean)
   * @see org.eclipse.emf.ecore.EcorePackage#getEStructuralFeature_Unsettable()
   * @model
   * @generated
   */
  function get unsettable():Boolean;

  /**
   * Sets the value of the '{@link org.eclipse.emf.ecore.EStructuralFeature#isUnsettable <em>Unsettable</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Unsettable</em>' attribute.
   * @see #isUnsettable()
   * @generated
   */
  function set unsettable(value:Boolean):void;

  /**
   * Returns the value of the '<em><b>Derived</b></em>' attribute.
   * <!-- begin-user-doc -->
   * <p>
   * A derived feature typically computes its value from those of other features.
   * It will typically be {@link #isTransient transient} 
   * and will often be {@link #isVolatile volatile} and not {@link #isChangeable changeable}.
   * The default {@link org.eclipse.emf.ecore.util.EcoreUtil.Copier copier} won't copy it.
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Derived</em>' attribute.
   * @see #setDerived(boolean)
   * @see org.eclipse.emf.ecore.EcorePackage#getEStructuralFeature_Derived()
   * @model
   * @generated
   */
  function get derived():Boolean;

  /**
   * Sets the value of the '{@link org.eclipse.emf.ecore.EStructuralFeature#isDerived <em>Derived</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Derived</em>' attribute.
   * @see #isDerived()
   * @generated
   */
  function set derived(value:Boolean):void;

  /**
   * Returns the value of the '<em><b>EContaining Class</b></em>' container reference.
   * It is bidirectional and its opposite is '{@link org.eclipse.emf.ecore.EClass#getEStructuralFeatures <em>EStructural Features</em>}'.
   * <!-- begin-user-doc -->
   * <p>
   * It represents the containing class of this feature.
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>EContaining Class</em>' container reference.
   * @see org.eclipse.emf.ecore.EcorePackage#getEStructuralFeature_EContainingClass()
   * @see org.eclipse.emf.ecore.EClass#getEStructuralFeatures
   * @model opposite="eStructuralFeatures" resolveProxies="false" changeable="false"
   * @generated
   */
  function get eContainingClass():EClass;

  /**
   * <!-- begin-user-doc -->
   * Returns the ID relative to the {@link #getEContainingClass containing} class.
   * @return  the relative ID.
   * <!-- end-user-doc -->
   * @model kind="operation"
   * @generated
   */
  function get featureID():int;

  /**
   * <!-- begin-user-doc -->
   * Returns the {@link EClassifier#getInstanceClass instance class} of the {@link #getEContainingClass containing} class.
   * @return the instance class of the containing class.
   * <!-- end-user-doc -->
   * @model kind="operation"
   * @generated
   */
  function get containerClass():Class;



}
}